const validators = {
    /**
     * @param min 最小长度
     * @param max 最大长度
     * @param {*} param
     */
    length({ min = 0, max = 10000 }) {
        return function (rule, value, callback) {
            // 将中文转换成两个字符长度
            let realen = value.replace(/\p{Unified_Ideograph}/u, 'aa').length
            realen <= max && realen >= min ? callback('') : max < 10000 ? callback('输入长度应在' + min + '至' + max + '个字符之间') : callback('至少应输入' + min + '个字符')
        }
    },
    /**
     * 整数和小数的允许输入数字范围限制
     * @param {min, max} 数字的范围, 可以只填min或max, 也可以2个都填, 闭区间
     */
    range_number({ min, max }) {
        return function (rule, value, callback) {
            let msgerr = '数字范围限制( ' + min + ' ~ ' + max + ' )';
            if (min == undefined) {
                msgerr = '数字不得大于 ' + max;
            } else if (max == undefined) {
                msgerr = '数字不得小于 ' + min;
            }
            if (value != '' && Number(value)) {
                if (min != undefined && min > value) {
                    callback(msgerr);
                } else if (max != undefined && max < value) {
                    callback(msgerr);
                } else {
                    callback();
                }
            } else {
                callback();
            }
        }
    },
    /**
     * 日期的允许输入范围限制, 参数为字符串格式'YYYY-MM-DD'
     * 在日期选择控件上使用时, 触发类型必须为change, blur无效
     * @param {min, max} 日期的范围, 可以只填min或max, 也可以2个都填, 闭区间
     */
    range_date({ min, max }) {
        return function (rule, value, callback) {
            let msgerr = '日期范围限制( ' + min + ' ~ ' + max + ' )';
            if (min == undefined) {
                msgerr = '日期不得晚于 ' + max;
            } else if (max == undefined) {
                msgerr = '日期不得早于 ' + min;
            }
            if (value != '') {
                console.log("value: ", value);
                console.log("min: ", min);
                console.log("conpare min>value: ", min > value);
                console.log("conpare max<value: ", max < value);
                if (min != undefined && min > value) {
                    callback(msgerr);
                } else if (max != undefined && max < value) {
                    callback(msgerr);
                } else {
                    callback();
                }
            } else {
                callback();
            }
        }
    },
    /**
     * 整数, 最多10位, 可正负
     */
    integer() {
        return function (rule, value, callback) {
            const reg = /^[-+]?\d{1,10}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入整数'));
            } else {
                callback();
            }
        }
    },
    /**
     * 小数, 任意位不控制, 可正负
     */
    double() {
        return function (rule, value, callback) {
            const reg = /^[+-]?[0-9]+\.?[0-9]*$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入小数'));
            } else {
                callback();
            }
        }
    },
    /**
     * 小数, 尾数最多1位, 可正负
     */
    double1() {
        return function (rule, value, callback) {
            const reg = /^[+-]?[0-9]+\.?[0-9]{0,1}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入小数(尾数最多1位)'));
            } else {
                callback();
            }
        }
    },
    /**
     * 小数, 尾数最多2位, 可正负
     */
    double2() {
        return function (rule, value, callback) {
            const reg = /^[+-]?[0-9]+\.?[0-9]{0,2}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入小数(尾数最多2位)'));
            } else {
                callback();
            }
        }
    },
    /**
     * 小数, 尾数最多3位, 可正负
     */
    double3() {
        return function (rule, value, callback) {
            const reg = /^[+-]?[0-9]+\.?[0-9]{0,3}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入小数(尾数最多3位)'));
            } else {
                callback();
            }
        }
    },
    /**
     * 小数, 尾数最多4位, 可正负
     */
    double4() {
        return function (rule, value, callback) {
            const reg = /^[+-]?[0-9]+\.?[0-9]{0,4}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入小数(尾数最多4位)'));
            } else {
                callback();
            }
        }
    },
    /**
     * 小数, 尾数最多5位, 可正负
     */
    double5() {
        return function (rule, value, callback) {
            const reg = /^[+-]?[0-9]+\.?[0-9]{0,5}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入小数(尾数最多5位)'));
            } else {
                callback();
            }
        }
    },
    /**
     * 小数, 尾数最多6位, 可正负
     */
    double6() {
        return function (rule, value, callback) {
            const reg = /^[+-]?[0-9]+\.?[0-9]{0,6}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入小数(尾数最多6位)'));
            } else {
                callback();
            }
        }
    },
    /**
     * 手机号码11位
     */
    mobile() {
        return function (rule, value, callback) {
            const reg = /^[1][3-9][0-9]{9}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入正确的手机号码格式(11位)'));
            } else {
                callback();
            }
        }
    },
    /**
     * 座机号码, 可选择含区号
     * 1234567
     * 12345678
     * 010-1234567
     * 0791-12345678
     */
    telephone() {
        return function (rule, value, callback) {
            const reg = /^(0\d{2,3}-)?\d{7,8}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入正确的固定电话格式'));
            } else {
                callback();
            }
        }
    },
    /**
     * 电子邮箱
     */
    email() {
        return function (rule, value, callback) {
            const reg = /^([a-zA-Z0-9]+[-_\.]?)+@[a-zA-Z0-9]+(\.[a-z]+){1,2}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入正确的电子邮箱格式'));
            } else {
                callback();
            }
        }
    },
    /**
     * 身份证号18位
     */
    ssn() {
        return function (rule, value, callback) {
            const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入正确的身份证号格式(18位)'));
            } else {
                callback();
            }
        }
    },
    /**
     * 邮政编码/行政区划编码6位
     */
    zip() {
        return function (rule, value, callback) {
            const reg = /^\d{6}$/;
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入正确的编码格式(6位)'));
            } else {
                callback();
            }
        }
    },

    /**
     * 链接地址
     */
    url() {
        return function (rule, value, callback) {
            const reg = new RegExp("^((https|http|ftp|rtsp|mms)?://)"
                + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@ 
                + "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184 
                + "|" // 允许IP和DOMAIN（域名）
                + "([0-9a-z_!~*'()-]+\.)*" // 域名- www. 
                + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二级域名 
                + "[a-z]{2,6})" // first level domain- .com or .museum 
                + "(:[0-9]{1,4})?" // 端口- :80 
                + "((/?)|" // a slash isn't required if there is no file name 
                + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$");
            if ((!reg.test(value)) && value != '') {
                callback(new Error('请输入正确的链接地址'));
            } else {
                callback();
            }
        }
    }
}

export default validators